#include "Task.hpp"
#include "RingQueue.h"
#include <unistd.h>

//处于静态区的变量是最先被创建的，所以会影响程序启动效率
// int g_val = 100;

std::string oper = "+-*/%";  

void *Consumer(void *args)
{
    RingQueue<Task> *rq = static_cast<RingQueue<Task>*>(args);
    while(true)
    {
        sleep(1);
        // std::cout << "Consumer 启动成功！" << std::endl;
        // Task *t; 会出现段错误, 因为没有初始化
        // Task *t = new Task;
        Task t;
        rq->pop(&t);
        t();
    }

}

void *Productor(void *args)
{
    RingQueue<Task> *rq = static_cast<RingQueue<Task>*>(args);

    int len = oper.size();
    while(true)
    {
        sleep(1);

        int _data1 = rand() % 10;
        int _data2 = rand() % 10 + 1;

        char ch = oper[rand() % oper.size()];
        Task t(_data1, _data2, ch);
        rq->push(t);
        // std::cout << "Productor 启动成功！" << std::endl;
        t.GetTask();
    }

}

int main()
{
    //种下一颗随机数种子
    srand(time(nullptr) ^ getpid());
    pthread_t c, p;
    // RingQueue<Task> rq(10); //使用的是主线程的栈区
    RingQueue<Task>* rq = new RingQueue<Task>(10);

    pthread_create(&p, nullptr, Productor, rq);
    pthread_create(&c, nullptr, Consumer, rq);

    pthread_join(p, nullptr);
    pthread_join(c, nullptr);

    return 0;
}

// int main()
// {
//     // std::cout << g_val << std::endl;

//     //种下一颗随机数种子
//     srand(time(nullptr) ^ getpid());
//     pthread_t c[3], p[5];
//     // RingQueue<Task> rq(10); //使用的是主线程的栈区
//     RingQueue<Task>* rq = new RingQueue<Task>(10);

//     for(int i = 0; i < 5; i++)
//     {
//         pthread_create(p + i, nullptr, Productor, rq);
//     }

//     for(int i = 0; i < 3; i++)
//     {
//         pthread_create(c + i, nullptr, Consumer, rq);
//     }

//     for(int i = 0; i < 5; i++)
//     {
//         pthread_join(p[i], nullptr);
//     }

//     for(int i = 0; i < 3; i++)
//     {
//         pthread_join(c[i], nullptr);
//     }

//     return 0;
// }



//一个生产者一个消费者场景

// std::string oper = "+-*/%";  

// void *Consumer(void *args)
// {
//     RingQueue<Task> *rq = static_cast<RingQueue<Task>*>(args);
//     while(true)
//     {
//         // sleep(1);
//         // std::cout << "Consumer 启动成功！" << std::endl;
//         Task* t;
//         rq->pop(t);

//         (*t)();
//     }

// }

// void *Productor(void *args)
// {
//     RingQueue<Task> *rq = static_cast<RingQueue<Task>*>(args);

//     while(true)
//     {
//         // sleep(1);

//         int _data1 = rand() % 10;
//         int _data2 = rand() % 10 + 1;

//         int len = _data1 % oper.size();
//         Task t(_data1, _data2, oper[len]);
//         rq->push(t);
//         // std::cout << "Productor 启动成功！" << std::endl;
//         t.GetTask();
//     }

// }

// int main()
// {
//     // std::cout << g_val << std::endl;

//     //种下一颗随机数种子
//     srand(time(nullptr) ^ getpid());
//     pthread_t c, p;
//     RingQueue<Task> *rq = new RingQueue<Task>(10);

//     pthread_create(&c, nullptr, Consumer, rq);
//     pthread_create(&p, nullptr, Productor, rq);

//     pthread_join(c, nullptr);
//     pthread_join(p, nullptr);

//     return 0;
// }